{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "0f68e47a-3d1f-4571-89e0-2e3685bcd6be",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Reading in LAMOST data...\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "print(\"Reading in LAMOST data...\")\n",
    "X = np.load('fluxs.npy')\n",
    "y = np.load('sclss.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "989fcfeb-d70b-4e46-8bd5-5772d0e624a4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(700, 3700)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "c645ad48-7c68-4007-b235-def2fc5f3d65",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['B', 'F', 'F', 'A', 'G', 'K', 'O', 'B', 'M', 'O', 'G', 'M', 'F',\n",
       "       'K', 'G', 'F', 'F', 'O', 'B', 'G', 'F', 'G', 'B', 'O', 'A', 'K',\n",
       "       'M', 'A', 'F', 'F', 'F', 'G', 'F', 'A', 'K', 'G', 'A', 'G', 'K',\n",
       "       'K', 'K', 'A', 'K', 'G', 'G', 'F', 'A', 'M', 'B', 'F', 'K', 'B',\n",
       "       'G', 'F', 'F', 'O', 'O', 'M', 'F', 'A', 'O', 'G', 'O', 'O', 'K',\n",
       "       'F', 'G', 'A', 'A', 'B', 'G', 'F', 'G', 'F', 'M', 'K', 'A', 'B',\n",
       "       'B', 'G', 'K', 'K', 'M', 'M', 'A', 'G', 'K', 'M', 'B', 'K', 'G',\n",
       "       'G', 'B', 'O', 'B', 'B', 'O', 'F', 'G', 'B', 'O', 'K', 'O', 'G',\n",
       "       'K', 'B', 'O', 'G', 'A', 'K', 'M', 'F', 'A', 'F', 'F', 'A', 'M',\n",
       "       'B', 'A', 'O', 'O', 'F', 'K', 'A', 'O', 'K', 'M', 'A', 'M', 'G',\n",
       "       'O', 'K', 'A', 'M', 'K', 'O', 'F', 'B', 'F', 'B', 'M', 'O', 'O',\n",
       "       'K', 'O', 'M', 'K', 'A', 'M', 'O', 'G', 'O', 'B', 'O', 'A', 'K',\n",
       "       'G', 'B', 'K', 'F', 'A', 'M', 'B', 'M', 'G', 'G', 'O', 'F', 'O',\n",
       "       'B', 'O', 'K', 'M', 'A', 'O', 'F', 'M', 'A', 'G', 'O', 'A', 'K',\n",
       "       'F', 'M', 'O', 'F', 'F', 'F', 'K', 'G', 'O', 'O', 'O', 'F', 'K',\n",
       "       'B', 'F', 'G', 'M', 'F', 'M', 'B', 'A', 'A', 'G', 'F', 'M', 'B',\n",
       "       'B', 'A', 'G', 'K', 'O', 'F', 'M', 'O', 'G', 'O', 'A', 'F', 'M',\n",
       "       'M', 'O', 'B', 'B', 'B', 'A', 'A', 'K', 'K', 'B', 'F', 'F', 'F',\n",
       "       'F', 'G', 'M', 'B', 'O', 'M', 'M', 'G', 'G', 'F', 'A', 'K', 'G',\n",
       "       'B', 'A', 'O', 'O', 'G', 'A', 'F', 'B', 'M', 'A', 'B', 'G', 'F',\n",
       "       'A', 'G', 'K', 'G', 'A', 'A', 'M', 'B', 'A', 'K', 'K', 'B', 'K',\n",
       "       'O', 'A', 'F', 'A', 'M', 'O', 'A', 'G', 'M', 'G', 'F', 'M', 'K',\n",
       "       'B', 'F', 'K', 'B', 'G', 'A', 'A', 'F', 'A', 'B', 'A', 'G', 'G',\n",
       "       'A', 'A', 'A', 'O', 'F', 'M', 'B', 'F', 'F', 'M', 'M', 'G', 'K',\n",
       "       'K', 'F', 'B', 'A', 'G', 'B', 'B', 'M', 'A', 'K', 'B', 'M', 'G',\n",
       "       'K', 'B', 'O', 'A', 'F', 'F', 'M', 'F', 'G', 'G', 'K', 'G', 'M',\n",
       "       'M', 'K', 'G', 'A', 'F', 'K', 'B', 'B', 'G', 'G', 'G', 'B', 'A',\n",
       "       'M', 'M', 'F', 'O', 'K', 'A', 'G', 'K', 'K', 'B', 'M', 'B', 'M',\n",
       "       'A', 'F', 'G', 'F', 'B', 'K', 'B', 'K', 'O', 'F', 'O', 'G', 'A',\n",
       "       'A', 'K', 'K', 'B', 'B', 'K', 'O', 'G', 'O', 'M', 'A', 'F', 'O',\n",
       "       'A', 'K', 'M', 'M', 'A', 'G', 'F', 'A', 'G', 'M', 'K', 'B', 'O',\n",
       "       'A', 'B', 'K', 'O', 'B', 'K', 'G', 'F', 'F', 'F', 'G', 'M', 'G',\n",
       "       'F', 'O', 'B', 'O', 'K', 'K', 'G', 'O', 'A', 'K', 'O', 'G', 'G',\n",
       "       'G', 'M', 'K', 'M', 'B', 'G', 'F', 'K', 'K', 'M', 'B', 'O', 'B',\n",
       "       'A', 'O', 'F', 'F', 'A', 'G', 'O', 'O', 'B', 'O', 'K', 'A', 'F',\n",
       "       'O', 'F', 'F', 'A', 'K', 'F', 'K', 'G', 'B', 'F', 'O', 'B', 'G',\n",
       "       'F', 'G', 'O', 'G', 'G', 'M', 'F', 'A', 'O', 'M', 'B', 'G', 'M',\n",
       "       'B', 'M', 'F', 'B', 'A', 'A', 'F', 'K', 'K', 'K', 'A', 'B', 'K',\n",
       "       'F', 'F', 'B', 'O', 'B', 'K', 'M', 'K', 'K', 'K', 'O', 'M', 'O',\n",
       "       'B', 'A', 'B', 'A', 'B', 'G', 'B', 'M', 'M', 'G', 'K', 'F', 'G',\n",
       "       'O', 'F', 'K', 'A', 'B', 'G', 'B', 'O', 'F', 'G', 'O', 'K', 'K',\n",
       "       'O', 'K', 'F', 'B', 'F', 'M', 'K', 'M', 'A', 'G', 'A', 'O', 'B',\n",
       "       'B', 'B', 'A', 'F', 'K', 'O', 'B', 'A', 'A', 'M', 'M', 'A', 'B',\n",
       "       'G', 'B', 'M', 'O', 'K', 'K', 'O', 'A', 'G', 'M', 'G', 'O', 'B',\n",
       "       'M', 'M', 'O', 'G', 'A', 'M', 'O', 'B', 'K', 'M', 'O', 'O', 'G',\n",
       "       'A', 'A', 'B', 'M', 'A', 'G', 'M', 'B', 'G', 'K', 'B', 'M', 'M',\n",
       "       'M', 'M', 'K', 'F', 'A', 'A', 'O', 'O', 'F', 'A', 'K', 'K', 'B',\n",
       "       'F', 'K', 'K', 'M', 'M', 'A', 'B', 'M', 'O', 'F', 'M', 'M', 'A',\n",
       "       'O', 'A', 'M', 'F', 'O', 'B', 'B', 'A', 'O', 'O', 'M', 'A', 'G',\n",
       "       'O', 'O', 'K', 'M', 'M', 'O', 'B', 'O', 'G', 'K', 'M', 'M', 'B',\n",
       "       'G', 'O', 'K', 'A', 'A', 'O', 'K', 'M', 'F', 'B', 'K', 'O', 'F',\n",
       "       'M', 'O', 'G', 'G', 'G', 'M', 'M', 'F', 'O', 'A', 'M', 'G', 'B',\n",
       "       'M', 'G', 'F', 'O', 'A', 'F', 'M', 'K', 'B', 'A', 'O', 'B', 'B',\n",
       "       'G', 'F', 'M', 'K', 'K', 'B', 'M', 'A', 'F', 'G', 'F'], dtype='<U1')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y #每个光谱的标签"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "5d6372e5-9904-488e-ab34-376040fc7cfb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2ef296129c0>]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(X[0]) \n",
    "plt.plot(X[1])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "65594048-61f8-40ab-9fb0-f6f70b4e5fdb",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from sklearn import tree\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "from IPython.core.interactiveshell import InteractiveShell\n",
    "InteractiveShell.ast_node_interactivity = \"all\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "a4bfaf9c-2cce-4e61-ab18-4c6081b0955c",
   "metadata": {},
   "outputs": [],
   "source": [
    "trainData_X = X\n",
    "# 构造目标变量y的数据对象\n",
    "trainData_y=y\n",
    "#trainData_y=df.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "1e11d406-ea87-4f69-8ed2-68f5910d681a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=1024)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "4eab8a9b-660a-4ccf-b903-0fc240f1fbb0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(490, 3700) (210, 3700)\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape,X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "f638a50d-bc50-4919-b137-7e3e6529695d",
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'numpy.ndarray' object has no attribute 'value_counts'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[23], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m y_test\u001b[38;5;241m.\u001b[39mvalue_counts()\n",
      "\u001b[1;31mAttributeError\u001b[0m: 'numpy.ndarray' object has no attribute 'value_counts'"
     ]
    }
   ],
   "source": [
    "y_test.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "56305112-c904-414e-b22a-3bd14e9de66a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.        , 0.00771867, 0.        , ..., 0.        , 0.        ,\n",
       "       0.        ])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "dtree = DecisionTreeClassifier(max_depth=10)\n",
    "dtree.fit(X_train,y_train)\n",
    "dtree.feature_importances_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "439d295c-0cc7-4d14-b312-0e7d39befc0d",
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'numpy.ndarray' object has no attribute 'columns'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[30], line 4\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m      3\u001b[0m features \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame()\n\u001b[1;32m----> 4\u001b[0m features[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfeature\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m X_train\u001b[38;5;241m.\u001b[39mcolumns\n\u001b[0;32m      5\u001b[0m features[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mimportance\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m dtree\u001b[38;5;241m.\u001b[39mfeature_importances_\n\u001b[0;32m      6\u001b[0m features \u001b[38;5;241m=\u001b[39m features\u001b[38;5;241m.\u001b[39msort_values(by \u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mimportance\u001b[39m\u001b[38;5;124m'\u001b[39m], ascending\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n",
      "\u001b[1;31mAttributeError\u001b[0m: 'numpy.ndarray' object has no attribute 'columns'"
     ]
    }
   ],
   "source": [
    "# 查看特征的重要性排序\n",
    "import pandas as pd\n",
    "features = pd.DataFrame()\n",
    "features['feature'] = X_train.columns\n",
    "features['importance'] = dtree.feature_importances_\n",
    "features = features.sort_values(by =['importance'], ascending=False)\n",
    "\n",
    "# 显示最重要的前10个特征变量\n",
    "features.head(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "87b52e52-ebf8-44f0-b7a1-ae81b2d75688",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           A       0.77      0.85      0.81        27\n",
      "           B       0.79      0.77      0.78        35\n",
      "           F       0.74      0.65      0.69        31\n",
      "           G       0.64      0.79      0.71        29\n",
      "           K       0.74      0.79      0.77        29\n",
      "           M       0.95      0.70      0.81        27\n",
      "           O       0.84      0.84      0.84        32\n",
      "\n",
      "    accuracy                           0.77       210\n",
      "   macro avg       0.78      0.77      0.77       210\n",
      "weighted avg       0.78      0.77      0.77       210\n",
      "\n",
      "[[23  0  1  2  0  1  0]\n",
      " [ 2 27  4  0  0  0  2]\n",
      " [ 3  1 20  5  0  0  2]\n",
      " [ 0  1  2 23  3  0  0]\n",
      " [ 0  0  0  5 23  0  1]\n",
      " [ 2  0  0  1  5 19  0]\n",
      " [ 0  5  0  0  0  0 27]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = dtree.predict(X_test)\n",
    "y_test_prob = dtree.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))\n",
    "                       "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "792f33e5-7d40-4c32-bb15-aff8d3ae0caf",
   "metadata": {},
   "source": [
    "## 随机森林模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "9eaa264a-fbe0-4422-a535-564ad26ff6ae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           A       0.92      0.81      0.86        27\n",
      "           B       0.88      0.86      0.87        35\n",
      "           F       0.71      0.71      0.71        31\n",
      "           G       0.83      0.83      0.83        29\n",
      "           K       0.79      0.93      0.86        29\n",
      "           M       1.00      0.89      0.94        27\n",
      "           O       0.88      0.94      0.91        32\n",
      "\n",
      "    accuracy                           0.85       210\n",
      "   macro avg       0.86      0.85      0.85       210\n",
      "weighted avg       0.86      0.85      0.85       210\n",
      "\n",
      "[[22  1  3  0  0  0  1]\n",
      " [ 1 30  1  0  0  0  3]\n",
      " [ 1  2 22  4  2  0  0]\n",
      " [ 0  0  3 24  2  0  0]\n",
      " [ 0  0  1  1 27  0  0]\n",
      " [ 0  0  0  0  3 24  0]\n",
      " [ 0  1  1  0  0  0 30]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "rf = RandomForestClassifier(n_estimators = 100)\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "rf.fit(X_train, y_train)\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26d1fbc2-b5c3-4c84-8d64-dd5e0d096f5c",
   "metadata": {},
   "source": [
    "##  降维处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "56e249e7-c240-423c-8b34-f64b320cdcbc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Reading in LAMOST data...\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "print(\"Reading in LAMOST data...\")\n",
    "X = np.load('fluxs.npy')\n",
    "y = np.load('sclss.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "3f5bdb15-3913-4b0b-8d4a-1a7465f3e72b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[7.69781947e-01 1.79732129e-01 2.87020225e-02 7.28545245e-03\n",
      " 3.77821317e-03 1.60886708e-03 1.06216699e-03 9.34968761e-04\n",
      " 7.75228662e-04 5.61080466e-04 5.24076691e-04 4.02721605e-04\n",
      " 3.00759217e-04 2.39190311e-04 2.17195309e-04 1.86574878e-04\n",
      " 1.71983382e-04 1.48241030e-04 1.35164024e-04 1.17946867e-04\n",
      " 1.11023306e-04 9.83649661e-05 9.01366366e-05 8.41576475e-05\n",
      " 7.80471892e-05 7.15782808e-05 6.83236794e-05 6.44995598e-05\n",
      " 6.28621929e-05 6.06876056e-05 5.70444099e-05 5.56373816e-05\n",
      " 5.21774600e-05 5.02952971e-05 4.72301144e-05 4.45710248e-05\n",
      " 4.28627973e-05 4.14652313e-05 3.86264255e-05 3.78856894e-05\n",
      " 3.64541338e-05 3.39867838e-05 3.35471741e-05 3.22635460e-05\n",
      " 3.10312498e-05 3.05444009e-05 3.00085649e-05 2.93033827e-05\n",
      " 2.85451006e-05 2.74524500e-05]\n"
     ]
    },
    {
     "data": {
      "image/png": "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Yf78+TCZTIiKikJOTo7y7SeTyWT1zJvy8nKsX78eixcvdkSXiYiIqInTiYg4uhPXU0VFBYxGI8rLy+Hl5dXo7YfP2VLnsuMLhjb69oiIiP4M7Pn8dvi3pYiIiIgaE8MNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpisPDTUZGBiIiIuDm5obo6Gjs2bOn3nqz2YzU1FSEhYXBYDCgbdu2WL58+XXqLRERETV1zo7ceHZ2NqZPn46MjAz07dsXS5YsweDBg/H999+jdevWNtcZNWoUTp8+jWXLlqFdu3YoKSnBxYsXr3PPiYiIqKnSiYg4auO9e/dGr169kJmZqczr3LkzEhISkJaWZlX/0Ucf4f7778fRo0fRsmXLK9pmRUUFjEYjysvL4eXldcV9r0v4nC11Lju+YGijb4+IiOjPwJ7Pb4ddlqqsrER+fj7i4+NV8+Pj45GXl2dznU2bNiEmJgYLFy5Eq1at0KFDBzz++OP4/fffr0eXiYiI6AbgsMtSpaWlqKqqQkBAgGp+QEAATp06ZXOdo0ePYu/evXBzc8MHH3yA0tJSTJ48Gb/++mud992YzWaYzWbl54qKisZ7EURERNTkOPyGYp1Op/pZRKzmWVRXV0On02H16tW4+eabMWTIECxatAhvv/12nWdv0tLSYDQalSk0NLTRXwMRERE1HQ4LN76+vtDr9VZnaUpKSqzO5lgEBQWhVatWMBqNyrzOnTtDRPDzzz/bXCclJQXl5eXKVFxc3HgvgoiIiJoch4UbV1dXREdHIzc3VzU/NzcXcXFxNtfp27cvfvnlF5w7d06Z9+OPP8LJyQkhISE21zEYDPDy8lJNREREpF0OvSw1c+ZMLF26FMuXL8ehQ4cwY8YMFBUVITk5GcClsy5jx45V6h988EH4+PhgwoQJ+P7777F7927Mnj0bEydOhLu7u6NeBhERETUhDn3OTWJiIsrKyjB//nyYTCZERUUhJycHYWFhAACTyYSioiKlvlmzZsjNzcVjjz2GmJgY+Pj4YNSoUXjuuecc9RKIiIioiXHoc24cgc+5ISIiuvHcEM+5ISIiIroWGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxhuiIiISFMYboiIiEhTGG6IiIhIUxwebjIyMhAREQE3NzdER0djz549ddbu3LkTOp3Oavr3v/99HXtMRERETZlDw012djamT5+O1NRUFBQUoF+/fhg8eDCKiorqXe+HH36AyWRSpvbt21+nHhMREVFT59Bws2jRIiQlJWHSpEno3Lkz0tPTERoaiszMzHrX8/f3R2BgoDLp9frr1GMiIiJq6hwWbiorK5Gfn4/4+HjV/Pj4eOTl5dW7bs+ePREUFIQBAwZgx44d17KbREREdINxvpKVjhw5gvT0dBw6dAg6nQ6dO3fGtGnT0LZt2wa3UVpaiqqqKgQEBKjmBwQE4NSpUzbXCQoKQlZWFqKjo2E2m7Fy5UoMGDAAO3fuxK233mpzHbPZDLPZrPxcUVHR4D4SERHRjcfucLNt2zYMGzYMPXr0QN++fSEiyMvLQ2RkJDZv3ow777zTrvZ0Op3qZxGxmmfRsWNHdOzYUfk5NjYWxcXFeOmll+oMN2lpaXjmmWfs6hMRERHduOwON3PmzMGMGTOwYMECq/l///vfGxxufH19odfrrc7SlJSUWJ3NqU+fPn2watWqOpenpKRg5syZys8VFRUIDQ1tcPtERER0Y7H7nptDhw4hKSnJav7EiRPx/fffN7gdV1dXREdHIzc3VzU/NzcXcXFxDW6noKAAQUFBdS43GAzw8vJSTURERKRddp+58fPzQ2FhodXXrwsLC+Hv729XWzNnzsSYMWMQExOD2NhYZGVloaioCMnJyQAunXU5efIkVqxYAQBIT09HeHg4IiMjUVlZiVWrVmH9+vVYv369vS+DiIiINMrucPPQQw/h4YcfxtGjRxEXFwedToe9e/fihRdewKxZs+xqKzExEWVlZZg/fz5MJhOioqKQk5ODsLAwAIDJZFI986ayshKPP/44Tp48CXd3d0RGRmLLli0YMmSIvS+DiIiINEonImLPCiKC9PR0vPzyy/jll18AAMHBwZg9ezamTp1a583ATUVFRQWMRiPKy8uvySWq8Dlb6lx2fMHQRt8eERHRn4E9n992n7nR6XSYMWMGZsyYgbNnzwIAmjdvfmU9JSIiImpkV/ScGwuGGiIiImpqGhRuevXqhe3bt6NFixbo2bNnvZeevvnmm0brHBEREZG9GhRuhg8fDoPBoPx/U7+vhoiIiP68GhRu5s6dq/z/vHnzrlVfiIiIiK6a3Q/xa9OmDcrKyqzmnzlzBm3atGmUThERERFdKbvDzfHjx1FVVWU132w24+eff26UThERERFdqQZ/W2rTpk3K/2/btg1Go1H5uaqqCtu3b0dERETj9o6IiIjITg0ONwkJCQAuPedm3LhxqmUuLi4IDw/Hyy+/3KidIyIiIrJXg8NNdXU1ACAiIgJff/01fH19r1mniIiIiK6U3Q/xO3bs2LXoBxEREVGjuKInFP/222/YtWsXioqKUFlZqVo2derURukYERER0ZWwO9wUFBRgyJAhOH/+PH777Te0bNkSpaWl8PDwgL+/P8MNEREROZTdXwWfMWMG7rnnHvz6669wd3fHF198gRMnTiA6OhovvfTStegjERERUYPZHW4KCwsxa9Ys6PV66PV6mM1mhIaGYuHChXjyySevRR+JiIiIGszucOPi4qL8bamAgAAUFRUBAIxGo/L/RERERI5i9z03PXv2xL59+9ChQwfcfvvtePrpp1FaWoqVK1eia9eu16KPRERERA1m95mb559/HkFBQQCAZ599Fj4+PnjkkUdQUlKCrKysRu8gERERkT3sOnMjIvDz80NkZCQAwM/PDzk5OdekY0RERERXwq4zNyKC9u3b8w9kEhERUZNlV7hxcnJC+/btUVZWdq36Q0RERHRV7L7nZuHChZg9eza+/fbba9EfIiIioqti97elRo8ejfPnz6N79+5wdXWFu7u7avmvv/7aaJ0jIiIispfd4SY9Pf0adIOIiIiocdgdbsaNG3ct+kFERETUKOy+54aIiIioKWO4ISIiIk1huCEiIiJNYbghIiIiTbnicPPTTz9h27Zt+P333wFcenoxERERkaPZHW7KysowcOBAdOjQAUOGDIHJZAIATJo0CbNmzWr0DhIRERHZw+5wM2PGDDg7O6OoqAgeHh7K/MTERHz00UeN2jkiIiIie9n9nJuPP/4Y27ZtQ0hIiGp++/btceLEiUbrGBEREdGVsPvMzW+//aY6Y2NRWloKg8HQKJ0iIiIiulJ2h5tbb70VK1asUH7W6XSorq7Giy++iNtvv71RO0dERERkL7vDzYsvvoglS5Zg8ODBqKysxBNPPIGoqCjs3r0bL7zwgt0dyMjIQEREBNzc3BAdHY09e/Y0aL3PPvsMzs7O6NGjh93bJCIiIu2yO9x06dIFBw4cwM0334w777wTv/32G0aMGIGCggK0bdvWrrays7Mxffp0pKamoqCgAP369cPgwYNRVFRU73rl5eUYO3YsBgwYYG/3iYiISON04sAH1PTu3Ru9evVCZmamMq9z585ISEhAWlpanevdf//9aN++PfR6PTZu3IjCwsIGb7OiogJGoxHl5eXw8vK6mu7bFD5nS53Lji8Y2ujbIyIi+jOw5/Pb7jM3b731Ft577z2r+e+99x7eeeedBrdTWVmJ/Px8xMfHq+bHx8cjLy+v3u0fOXIEc+fObdB2zGYzKioqVBMRERFpl93hZsGCBfD19bWa7+/vj+eff77B7ZSWlqKqqgoBAQGq+QEBATh16pTNdQ4fPow5c+Zg9erVcHZu2LfY09LSYDQalSk0NLTBfSQiIqIbj93h5sSJE4iIiLCaHxYWdtl7ZWzR6XSqn0XEah4AVFVV4cEHH8QzzzyDDh06NLj9lJQUlJeXK1NxcbHdfSQiIqIbh90P8fP398eBAwcQHh6umr9//374+Pg0uB1fX1/o9XqrszQlJSVWZ3MA4OzZs9i3bx8KCgrw6KOPAgCqq6shInB2dsbHH3+MO+64w2o9g8HA5+8QERH9idh95ub+++/H1KlTsWPHDlRVVaGqqgqffvoppk2bhvvvv7/B7bi6uiI6Ohq5ubmq+bm5uYiLi7Oq9/LywsGDB1FYWKhMycnJ6NixIwoLC9G7d297XwoRERFpkN1nbp577jmcOHECAwYMUO57qa6uxtixY+265wYAZs6ciTFjxiAmJgaxsbHIyspCUVERkpOTAVy6pHTy5EmsWLECTk5OiIqKUq3v7+8PNzc3q/lERET052V3uHF1dUV2djaeffZZ7N+/H+7u7ujatSvCwsLs3nhiYiLKysowf/58mEwmREVFIScnR2nLZDJd0X08RERE9Ofl0OfcOAKfc0NERHTjsefz2+4zN1VVVXj77bexfft2lJSUoLq6WrX8008/tbdJIiIiokZjd7iZNm0a3n77bQwdOhRRUVE2v7ZNRERE5Ch2h5u1a9di3bp1GDJkyLXoDxEREdFVsfur4K6urmjXrt216AsRERHRVbM73MyaNQuLFy/Gn+w+ZCIiIrpB2H1Zau/evdixYwe2bt2KyMhIuLi4qJZv2LCh0TpHREREZC+7w423tzfuvffea9EXIiIioqtmd7h56623rkU/iIiIiBqF3ffcEBERETVldp+5AYD3338f69atQ1FRESorK1XLvvnmm0bpGBEREdGVsPvMzauvvooJEybA398fBQUFuPnmm+Hj44OjR49i8ODB16KPRERERA1md7jJyMhAVlYWXn/9dbi6uuKJJ55Abm4upk6divLy8mvRRyIiIqIGszvcFBUVIS4uDgDg7u6Os2fPAgDGjBmDNWvWNG7viIiIiOxkd7gJDAxEWVkZACAsLAxffPEFAODYsWN8sB8RERE5nN3h5o477sDmzZsBAElJSZgxYwbuvPNOJCYm8vk3RERE5HB2f1sqKysL1dXVAIDk5GS0bNkSe/fuxT333IPk5ORG7yARERGRPewON05OTnBy+t8Jn1GjRmHUqFGN2ikiIiKiK9WgcHPgwAFERUXByckJBw4cqLe2W7dujdIxIiIioivRoHDTo0cPnDp1Cv7+/ujRowd0Op3Nm4d1Oh2qqqoavZNEREREDdWgcHPs2DH4+fkp/09ERETUVDUo3ISFhQEALly4gHnz5uH//u//0KZNm2vaMSIiIqIrYddXwV1cXPDBBx9cq74QERERXTW7n3Nz7733YuPGjdegK0RERERXz+6vgrdr1w7PPvss8vLyEB0dDU9PT9XyqVOnNlrniIiIiOxld7hZunQpvL29kZ+fj/z8fNUynU7HcENEREQOZXe44beliIiIqCmz+54bIiIioqbM7jM3APDzzz9j06ZNKCoqQmVlpWrZokWLGqVjRERERFfC7nCzfft2DBs2DBEREfjhhx8QFRWF48ePQ0TQq1eva9FHIiIiogaz+7JUSkoKZs2ahW+//RZubm5Yv349iouL0b9/f4wcOfJa9JGIiIiowewON4cOHcK4ceMAAM7Ozvj999/RrFkzzJ8/Hy+88EKjd5CIiIjIHnaHG09PT5jNZgBAcHAwjhw5oiwrLS1tvJ4RERERXQG777np06cPPvvsM3Tp0gVDhw7FrFmzcPDgQWzYsAF9+vS5Fn0kIiIiajC7w82iRYtw7tw5AMC8efNw7tw5ZGdno127dnjllVcavYNERERE9rA73NT8a+AeHh7IyMho1A4RERERXQ2777mZMGECtm/fDhFplA5kZGQgIiICbm5uiI6Oxp49e+qs3bt3L/r27QsfHx+4u7ujU6dOPFtEREREKnaHm7KyMgwdOhQhISGYNWsWCgsLr3jj2dnZmD59OlJTU1FQUIB+/fph8ODBKCoqslnv6emJRx99FLt378ahQ4fw1FNP4amnnkJWVtYV94GIiIi0RSdXcArmzJkzWLduHd59913s2bMHHTt2xOjRo/Hggw8iPDy8we307t0bvXr1QmZmpjKvc+fOSEhIQFpaWoPaGDFiBDw9PbFy5coG1VdUVMBoNKK8vBxeXl4N7mtDhc/ZUuey4wuGNvr2iIiI/gzs+fy+or8t5e3tjYcffhg7d+7EiRMnMGHCBKxcuRLt2rVrcBuVlZXIz89HfHy8an58fDzy8vIa1EZBQQHy8vLQv3//OmvMZjMqKipUExEREWnXVf3hzAsXLmDfvn348ssvcfz4cQQEBDR43dLSUlRVVVmtExAQgFOnTtW7bkhICAwGA2JiYjBlyhRMmjSpztq0tDQYjUZlCg0NbXAfiYiI6MZzReFmx44deOihhxAQEIBx48ahefPm2Lx5M4qLi+1uS6fTqX4WEat5te3Zswf79u3DG2+8gfT0dKxZs6bO2pSUFJSXlyvTlfSRiIiIbhx2fxU8JCQEZWVlGDRoEJYsWYJ77rkHbm5udm/Y19cXer3e6ixNSUnJZc8ARUREAAC6du2K06dPY968eXjggQds1hoMBhgMBrv7R0RERDcmu8/cPP300/jll1+wceNGjBw58oqCDQC4uroiOjoaubm5qvm5ubmIi4trcDsiovw5CCIiIiK7z9w8/PDDjbbxmTNnYsyYMYiJiUFsbCyysrJQVFSE5ORkAJcuKZ08eRIrVqwAAPzzn/9E69at0alTJwCXnnvz0ksv4bHHHmu0PhEREdGNze5w05gSExNRVlaG+fPnw2QyISoqCjk5OQgLCwMAmEwm1TNvqqurkZKSgmPHjsHZ2Rlt27bFggUL8Le//c1RL4GIiIiamCt6zs2NjM+5ISIiuvFc8+fcEBERETVVDDdERESkKQw3REREpCkMN0RERKQpDDdERESkKQw3REREpCkMN0RERKQpDDdERESkKQw3REREpCkMN0RERKQpDDdERESkKQw3REREpCkMN0RERKQpDDdERESkKQw3REREpCkMN0RERKQpDDdERESkKQw3REREpCkMN0RERKQpDDdERESkKQw3REREpCkMN0RERKQpDDdERESkKQw3REREpCkMN0RERKQpDDdERESkKQw3REREpCkMN0RERKQpDDdERESkKQw3REREpCkMN0RERKQpDDdERESkKQw3REREpCkMN0RERKQpDg83GRkZiIiIgJubG6Kjo7Fnz546azds2IA777wTfn5+8PLyQmxsLLZt23Yde0tERERNnUPDTXZ2NqZPn47U1FQUFBSgX79+GDx4MIqKimzW7969G3feeSdycnKQn5+P22+/Hffccw8KCgquc8+JiIioqdKJiDhq471790avXr2QmZmpzOvcuTMSEhKQlpbWoDYiIyORmJiIp59+ukH1FRUVMBqNKC8vh5eX1xX1uz7hc7bUuez4gqGNvj0iIqI/A3s+vx125qayshL5+fmIj49XzY+Pj0deXl6D2qiursbZs2fRsmXLa9FFIiIiugE5O2rDpaWlqKqqQkBAgGp+QEAATp061aA2Xn75Zfz2228YNWpUnTVmsxlms1n5uaKi4so6TERERDcEh99QrNPpVD+LiNU8W9asWYN58+YhOzsb/v7+ddalpaXBaDQqU2ho6FX3mYiIiJouh4UbX19f6PV6q7M0JSUlVmdzasvOzkZSUhLWrVuHgQMH1lubkpKC8vJyZSouLr7qvhMREVHT5bBw4+rqiujoaOTm5qrm5+bmIi4urs711qxZg/Hjx+Pdd9/F0KGXv0HXYDDAy8tLNREREZF2OeyeGwCYOXMmxowZg5iYGMTGxiIrKwtFRUVITk4GcOmsy8mTJ7FixQoAl4LN2LFjsXjxYvTp00c56+Pu7g6j0eiw10FERERNh0PDTWJi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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA \n",
    "pca = PCA(n_components=50)\n",
    "X_pca = pca.fit_transform(X)\n",
    "\n",
    "var_ratio = pca.explained_variance_ratio_#计算比例\n",
    "print(var_ratio)\n",
    "\n",
    "#主成分\n",
    "fig2 = plt.figure()\n",
    "\n",
    "plt.bar(list(range(1, 51)),var_ratio)\n",
    "plt.xticks(list(range(1, 51)),list(range(1, 51)))\n",
    "plt.ylabel(\"variance ratio \")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "22cfa817-cc0d-42ed-abb5-a783701f0eb0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(700, 100)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>...</th>\n",
       "      <th>91</th>\n",
       "      <th>92</th>\n",
       "      <th>93</th>\n",
       "      <th>94</th>\n",
       "      <th>95</th>\n",
       "      <th>96</th>\n",
       "      <th>97</th>\n",
       "      <th>98</th>\n",
       "      <th>99</th>\n",
       "      <th>100</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-7.762850</td>\n",
       "      <td>-8.188303</td>\n",
       "      <td>2.471214</td>\n",
       "      <td>1.089294</td>\n",
       "      <td>-2.040435</td>\n",
       "      <td>-0.931474</td>\n",
       "      <td>2.518286</td>\n",
       "      <td>-0.440975</td>\n",
       "      <td>0.881685</td>\n",
       "      <td>2.024014</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.045815</td>\n",
       "      <td>0.016680</td>\n",
       "      <td>0.000600</td>\n",
       "      <td>0.012444</td>\n",
       "      <td>0.029136</td>\n",
       "      <td>0.051896</td>\n",
       "      <td>0.001299</td>\n",
       "      <td>-0.049703</td>\n",
       "      <td>0.033855</td>\n",
       "      <td>-0.011695</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-10.851158</td>\n",
       "      <td>4.094691</td>\n",
       "      <td>-2.558628</td>\n",
       "      <td>-0.444491</td>\n",
       "      <td>0.506801</td>\n",
       "      <td>-0.236448</td>\n",
       "      <td>0.166940</td>\n",
       "      <td>0.586399</td>\n",
       "      <td>0.080782</td>\n",
       "      <td>-0.071836</td>\n",
       "      <td>...</td>\n",
       "      <td>0.049467</td>\n",
       "      <td>0.021558</td>\n",
       "      <td>-0.061246</td>\n",
       "      <td>-0.054412</td>\n",
       "      <td>0.072482</td>\n",
       "      <td>0.024107</td>\n",
       "      <td>0.031559</td>\n",
       "      <td>0.044902</td>\n",
       "      <td>-0.037300</td>\n",
       "      <td>0.013175</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-10.148024</td>\n",
       "      <td>2.565082</td>\n",
       "      <td>-2.777507</td>\n",
       "      <td>-0.393387</td>\n",
       "      <td>0.773265</td>\n",
       "      <td>0.068795</td>\n",
       "      <td>-0.267050</td>\n",
       "      <td>0.134437</td>\n",
       "      <td>0.542404</td>\n",
       "      <td>-0.300937</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.012880</td>\n",
       "      <td>0.146178</td>\n",
       "      <td>0.061079</td>\n",
       "      <td>0.028636</td>\n",
       "      <td>0.067399</td>\n",
       "      <td>0.172577</td>\n",
       "      <td>0.016183</td>\n",
       "      <td>-0.052897</td>\n",
       "      <td>-0.001309</td>\n",
       "      <td>-0.030498</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>17.094687</td>\n",
       "      <td>6.508276</td>\n",
       "      <td>1.769200</td>\n",
       "      <td>2.395816</td>\n",
       "      <td>1.125327</td>\n",
       "      <td>-0.717889</td>\n",
       "      <td>0.063924</td>\n",
       "      <td>0.436536</td>\n",
       "      <td>-0.302128</td>\n",
       "      <td>0.173998</td>\n",
       "      <td>...</td>\n",
       "      <td>0.083664</td>\n",
       "      <td>0.040405</td>\n",
       "      <td>0.029446</td>\n",
       "      <td>0.003249</td>\n",
       "      <td>0.086395</td>\n",
       "      <td>-0.013657</td>\n",
       "      <td>0.016412</td>\n",
       "      <td>-0.030195</td>\n",
       "      <td>0.010573</td>\n",
       "      <td>0.001969</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-5.225841</td>\n",
       "      <td>1.237989</td>\n",
       "      <td>-1.586887</td>\n",
       "      <td>-0.502144</td>\n",
       "      <td>-0.066863</td>\n",
       "      <td>-0.427362</td>\n",
       "      <td>0.080287</td>\n",
       "      <td>0.147067</td>\n",
       "      <td>-0.435458</td>\n",
       "      <td>-0.076886</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.015435</td>\n",
       "      <td>-0.025790</td>\n",
       "      <td>0.104352</td>\n",
       "      <td>0.038357</td>\n",
       "      <td>-0.017958</td>\n",
       "      <td>0.108624</td>\n",
       "      <td>0.064590</td>\n",
       "      <td>-0.115654</td>\n",
       "      <td>-0.007077</td>\n",
       "      <td>-0.008488</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>695</th>\n",
       "      <td>15.543617</td>\n",
       "      <td>7.695351</td>\n",
       "      <td>2.277140</td>\n",
       "      <td>-0.078460</td>\n",
       "      <td>-1.886858</td>\n",
       "      <td>0.569683</td>\n",
       "      <td>0.268876</td>\n",
       "      <td>0.028725</td>\n",
       "      <td>-0.229167</td>\n",
       "      <td>0.042500</td>\n",
       "      <td>...</td>\n",
       "      <td>0.039908</td>\n",
       "      <td>0.017651</td>\n",
       "      <td>0.041794</td>\n",
       "      <td>-0.022118</td>\n",
       "      <td>0.025359</td>\n",
       "      <td>-0.064143</td>\n",
       "      <td>-0.030698</td>\n",
       "      <td>-0.050332</td>\n",
       "      <td>0.038158</td>\n",
       "      <td>0.008677</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>696</th>\n",
       "      <td>19.692528</td>\n",
       "      <td>0.782497</td>\n",
       "      <td>1.168980</td>\n",
       "      <td>2.965344</td>\n",
       "      <td>1.118519</td>\n",
       "      <td>-0.435972</td>\n",
       "      <td>0.190521</td>\n",
       "      <td>0.178110</td>\n",
       "      <td>-0.329783</td>\n",
       "      <td>-0.113030</td>\n",
       "      <td>...</td>\n",
       "      <td>0.028975</td>\n",
       "      <td>0.047489</td>\n",
       "      <td>0.056422</td>\n",
       "      <td>-0.034701</td>\n",
       "      <td>0.066667</td>\n",
       "      <td>0.027834</td>\n",
       "      <td>-0.010977</td>\n",
       "      <td>-0.008792</td>\n",
       "      <td>0.003370</td>\n",
       "      <td>-0.025906</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>697</th>\n",
       "      <td>-22.782017</td>\n",
       "      <td>18.330620</td>\n",
       "      <td>-6.144403</td>\n",
       "      <td>0.513169</td>\n",
       "      <td>0.199705</td>\n",
       "      <td>-0.500795</td>\n",
       "      <td>0.007539</td>\n",
       "      <td>-0.497706</td>\n",
       "      <td>-0.111407</td>\n",
       "      <td>0.304510</td>\n",
       "      <td>...</td>\n",
       "      <td>0.001836</td>\n",
       "      <td>-0.014711</td>\n",
       "      <td>0.008179</td>\n",
       "      <td>-0.016594</td>\n",
       "      <td>0.006606</td>\n",
       "      <td>0.011663</td>\n",
       "      <td>0.000618</td>\n",
       "      <td>-0.002952</td>\n",
       "      <td>-0.007925</td>\n",
       "      <td>-0.015112</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>698</th>\n",
       "      <td>1.789073</td>\n",
       "      <td>-6.018153</td>\n",
       "      <td>-3.386634</td>\n",
       "      <td>-1.082655</td>\n",
       "      <td>-0.147611</td>\n",
       "      <td>-0.232650</td>\n",
       "      <td>-0.465027</td>\n",
       "      <td>0.673678</td>\n",
       "      <td>-0.119490</td>\n",
       "      <td>0.222402</td>\n",
       "      <td>...</td>\n",
       "      <td>0.004876</td>\n",
       "      <td>0.001867</td>\n",
       "      <td>-0.011770</td>\n",
       "      <td>-0.001409</td>\n",
       "      <td>-0.009878</td>\n",
       "      <td>0.070643</td>\n",
       "      <td>0.043799</td>\n",
       "      <td>-0.086784</td>\n",
       "      <td>0.015202</td>\n",
       "      <td>0.013811</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>699</th>\n",
       "      <td>-4.586373</td>\n",
       "      <td>-9.743435</td>\n",
       "      <td>-2.844248</td>\n",
       "      <td>0.828844</td>\n",
       "      <td>-1.070295</td>\n",
       "      <td>-0.176432</td>\n",
       "      <td>0.012285</td>\n",
       "      <td>0.621773</td>\n",
       "      <td>-0.140881</td>\n",
       "      <td>0.002463</td>\n",
       "      <td>...</td>\n",
       "      <td>0.038368</td>\n",
       "      <td>-0.002616</td>\n",
       "      <td>0.015932</td>\n",
       "      <td>-0.015006</td>\n",
       "      <td>-0.017759</td>\n",
       "      <td>-0.001615</td>\n",
       "      <td>0.003471</td>\n",
       "      <td>0.118673</td>\n",
       "      <td>-0.081693</td>\n",
       "      <td>-0.001365</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>700 rows × 100 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           1          2         3         4         5         6         7    \\\n",
       "0    -7.762850  -8.188303  2.471214  1.089294 -2.040435 -0.931474  2.518286   \n",
       "1   -10.851158   4.094691 -2.558628 -0.444491  0.506801 -0.236448  0.166940   \n",
       "2   -10.148024   2.565082 -2.777507 -0.393387  0.773265  0.068795 -0.267050   \n",
       "3    17.094687   6.508276  1.769200  2.395816  1.125327 -0.717889  0.063924   \n",
       "4    -5.225841   1.237989 -1.586887 -0.502144 -0.066863 -0.427362  0.080287   \n",
       "..         ...        ...       ...       ...       ...       ...       ...   \n",
       "695  15.543617   7.695351  2.277140 -0.078460 -1.886858  0.569683  0.268876   \n",
       "696  19.692528   0.782497  1.168980  2.965344  1.118519 -0.435972  0.190521   \n",
       "697 -22.782017  18.330620 -6.144403  0.513169  0.199705 -0.500795  0.007539   \n",
       "698   1.789073  -6.018153 -3.386634 -1.082655 -0.147611 -0.232650 -0.465027   \n",
       "699  -4.586373  -9.743435 -2.844248  0.828844 -1.070295 -0.176432  0.012285   \n",
       "\n",
       "          8         9         10   ...       91        92        93   \\\n",
       "0   -0.440975  0.881685  2.024014  ... -0.045815  0.016680  0.000600   \n",
       "1    0.586399  0.080782 -0.071836  ...  0.049467  0.021558 -0.061246   \n",
       "2    0.134437  0.542404 -0.300937  ... -0.012880  0.146178  0.061079   \n",
       "3    0.436536 -0.302128  0.173998  ...  0.083664  0.040405  0.029446   \n",
       "4    0.147067 -0.435458 -0.076886  ... -0.015435 -0.025790  0.104352   \n",
       "..        ...       ...       ...  ...       ...       ...       ...   \n",
       "695  0.028725 -0.229167  0.042500  ...  0.039908  0.017651  0.041794   \n",
       "696  0.178110 -0.329783 -0.113030  ...  0.028975  0.047489  0.056422   \n",
       "697 -0.497706 -0.111407  0.304510  ...  0.001836 -0.014711  0.008179   \n",
       "698  0.673678 -0.119490  0.222402  ...  0.004876  0.001867 -0.011770   \n",
       "699  0.621773 -0.140881  0.002463  ...  0.038368 -0.002616  0.015932   \n",
       "\n",
       "          94        95        96        97        98        99        100  \n",
       "0    0.012444  0.029136  0.051896  0.001299 -0.049703  0.033855 -0.011695  \n",
       "1   -0.054412  0.072482  0.024107  0.031559  0.044902 -0.037300  0.013175  \n",
       "2    0.028636  0.067399  0.172577  0.016183 -0.052897 -0.001309 -0.030498  \n",
       "3    0.003249  0.086395 -0.013657  0.016412 -0.030195  0.010573  0.001969  \n",
       "4    0.038357 -0.017958  0.108624  0.064590 -0.115654 -0.007077 -0.008488  \n",
       "..        ...       ...       ...       ...       ...       ...       ...  \n",
       "695 -0.022118  0.025359 -0.064143 -0.030698 -0.050332  0.038158  0.008677  \n",
       "696 -0.034701  0.066667  0.027834 -0.010977 -0.008792  0.003370 -0.025906  \n",
       "697 -0.016594  0.006606  0.011663  0.000618 -0.002952 -0.007925 -0.015112  \n",
       "698 -0.001409 -0.009878  0.070643  0.043799 -0.086784  0.015202  0.013811  \n",
       "699 -0.015006 -0.017759 -0.001615  0.003471  0.118673 -0.081693 -0.001365  \n",
       "\n",
       "[700 rows x 100 columns]"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca = PCA(n_components=100) #把所有数据降维成100\n",
    "X_pca = pca.fit_transform(X)\n",
    "print(X_pca.shape)\n",
    "principalDf = pd.DataFrame(data = X_pca\n",
    "             , columns = list(range(1, 101)))  #将array转换成df格式，以便使用随机森林\n",
    "principalDf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "319d2166-c5f1-4955-b093-b694d4885d8e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5b891381-a7f1-49b9-8c94-b9862cb7ba56",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from sklearn import tree\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "from IPython.core.interactiveshell import InteractiveShell\n",
    "InteractiveShell.ast_node_interactivity = \"all\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "3d9deb56-1804-42b6-a57f-cdac2c9a032d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd \n",
    "df = principalDf\n",
    "trainData_X = principalDf  #降维后的x里面是有效数据，y里面全是标签\n",
    "trainData_y = y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "85c8330a-b7a2-4c83-ae42-e05f0c3ecd52",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(490, 100) (210, 100)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=2048)\n",
    "print(X_train.shape,X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "44f4d9a0-9ff7-460f-9ee9-a9ffe029c8a3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           A       1.00      0.83      0.91        24\n",
      "           B       0.92      0.92      0.92        26\n",
      "           F       0.79      0.79      0.79        33\n",
      "           G       0.92      0.87      0.89        38\n",
      "           K       0.71      0.93      0.81        27\n",
      "           M       0.97      0.89      0.93        37\n",
      "           O       0.88      0.92      0.90        25\n",
      "\n",
      "    accuracy                           0.88       210\n",
      "   macro avg       0.89      0.88      0.88       210\n",
      "weighted avg       0.89      0.88      0.88       210\n",
      "\n",
      "[[20  0  2  0  1  0  1]\n",
      " [ 0 24  1  0  0  0  1]\n",
      " [ 0  2 26  1  3  0  1]\n",
      " [ 0  0  3 33  2  0  0]\n",
      " [ 0  0  0  2 25  0  0]\n",
      " [ 0  0  1  0  3 33  0]\n",
      " [ 0  0  0  0  1  1 23]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "rf = RandomForestClassifier(n_estimators = 100)\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "rf.fit(X_train, y_train)\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d95f9eb2-ed70-44ef-850f-2221c342a636",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d961e7ec-0540-4111-9cb4-b2856ba0103f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e492c688-bd9e-486d-8f82-da5248bafb6f",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
